package com.mazaiting.common.core.domain.result;

import java.io.Serializable;

/**
 * 规定:
 * #1表示成功
 * #0表示失败
 * #1001～1999 区间表示参数错误
 * #2001～2999 区间表示用户错误
 * #3001～3999 区间表示角色错误
 * #4001～4999 区间表示内部错误
 * #5001～5999 区间表示业务错误
 */
public enum ResultCode implements IResultCode, Serializable {
    /* 成功 */
    SUCCESS(1, "处理成功"),

    /* 默认失败 */
    COMMON_FAIL(0, "处理失败"),

    /* 参数错误：1000～1999 */
    PARAM_NOT_VALID(1001, "参数无效"),
    PARAM_IS_BLANK(1002, "参数为空"),
    PARAM_TYPE_ERROR(1003, "参数类型错误"),
    PARAM_NOT_COMPLETE(1004, "参数缺失"),
    PARAM_EXPIRED_TOKEN(1005, "TOKEN无效或已过期"),
    PARAM_TOKEN_CONFIG_ERROR(1006, "TOKEN有效期配置异常"),
    PARAM_EXPIRED_REFRESH_TOKEN(1007, "REFRESH_TOKEN无效或已过期, 请重新登录"),
    PARAM_NO_EXPIRED_TOKEN(1008, "token未过期, 无法刷新"),
    DELETE_SUCCESS(1009, "删除成功"),
    REQUEST_METHOD_ERROR(1010, "请求类型错误"),
    OBJECT_IS_NULL(1011, "对象为空"),
    PARAM_CHECK_ERROR(1012, "参数校验异常"),
    PARAM_CHECK_ENUM_ERROR(1013, "枚举参数值不存在"),

    /* 用户错误 */
    USER_NAME_EMPTY(2000, "用户名不能为空"),
    USER_NOT_LOGIN(2001, "用户未登录"),
    USER_ACCOUNT_EXPIRED(2002, "账号已过期"),
    USER_CREDENTIALS_ERROR(2003, "密码错误"),
    USER_CREDENTIALS_EXPIRED(2004, "密码过期"),
    USER_ACCOUNT_DISABLE(2005, "账号不可用"),
    USER_ACCOUNT_LOCKED(2006, "账号被锁定"),
    USER_ACCOUNT_NOT_EXIST(2007, "账号不存在"),
    USER_ACCOUNT_ALREADY_EXIST(2008, "用户已存在"),
    USER_ACCOUNT_USE_BY_OTHERS(2009, "账号下线"),
    USER_ID_ERROR(2010, "用户Id错误"),
    USER_NOT_EXIST(2011, "用户不存在"),
    USER_ADD_SUCCESS(2012, "添加用户成功"),
    USER_UPDATE_SUCCESS(2013, "修改用户成功"),
    USER_ACCOUNT_ALREADY_DELETE_EXIST(2014, "此用户名无法注册"),
    USER_ADD_ERROR_ROLE(2015, "添加或修改用户失败, 错误的角色"),
    PASSWORD_NOT_STANDARD(2016, "密码强度不符合规范"),
    CLIENT_AUTHENTICATION_FAILED(2017, "客户端验证失败"),
    ACCESS_UNAUTHORIZED(2018, "访问未授权"),
    TOKEN_INVALID_OR_EXPIRED(2019, "令牌无效或已过期"),
    TOKEN_ACCESS_FORBIDDEN(2020, "令牌访问拒绝"),
    USERNAME_OR_PASSWORD_ERROR(2021, "用户名或密码不正确"),
    VERIFY_CODE_ERROR(2022, "验证码不正确"),
    ACCESS_UNAUTHORIZED_BTN(2023, "功能未授权"),
    USER_ID_NULL(2024, "用户 ID 为空"),
    USER_LIST_EMPTY(2025, "用户列表数据为空"),
    USER_LIST_VALID_EMPTY(2026, "用户有效列表数据为空"),
    USER_LIST_CONTAINS_REPEAT_NAME(2027, "用户列表中存在重复的用户名"),
    USER_IMPORT_FAILED(2028, "用户导入失败"),
    /*角色错误*/
    ROLE_ID_ERROR(2100, "角色ID错误, 请检查"),
    ROLE_EXIST(2101, "角色已存在"),
    ROLE_NOT_EXIST(2102, "角色不存在"),
    ROLE_CODE_NULL(2103, "角色码值为空"),
    ROLE_ROOT_NOT_ROOT(2104, "超级管理员用户必须包含超级管理员角色"),
    ROLE_CODE_NOT_EXIST(2105, "角色码值为不存在"),
    ROLE_NOT_EFFECT_LIST(2106, "无可用角色列表"),
    ROLE_EMPTY(2107, "角色列表为空"),
    ROLE_ALLOC_USER(2108, "该角色已分配用户，无法删除"),
    USER_NO_PERMISSION(2109, "无操作权限"),
    USER_NOT_DELETE_ROOT(2110, "不能删除管理员账户"),
    /*菜单错误*/
    MENU_EXIST(2200, "菜单已存在"),
    MENU_NOT_EXIST(2201, "菜单不存在"),
    MENU_ALLOC_ERROR(2202, "分配菜单失败, 未知菜单"),
    MENU_LIST_IS_NULL(2203, "无可用菜单"),
    MENU_PATH_FORMAT_ERROR(2204, "目录路由路径格式错误, 必须以/开始"),
    /*请求地址错误*/
    URL_EXIST(2300, "目标接口已存在"),
    URL_NOT_EXIST(2301, "目标接口不存在"),
    URL_ROLE_EXIST(2302, "目标接口与角色关系已存在"),
    /*权限错误*/
    PERMISSION_EMPTY(2401, "权限列表为空"),
    PERMISSION_EXIST(2402, "权限已存在"),
    PERMISSION_NOT_EXIST(2403, "权限不存在"),
    DEPT_NOT_EXIST(2500, "部门不存在"),
    DEPT_EXIST(2501, "部门存在"),
    DICT_TYPE_EXIST(2601, "字典类型已存在"),
    DICT_TYPE_EMPTY(2602, "字典类型不存在"),
    DICT_ITEM_EMPTY(2603, "字典项不存在"),
    DICT_ITEM_EXIST(2604, "字典项已存在"),

    /*表示内部错误*/
    REDIS_CONNECTION_ERROR(4001, "redis数据库连接异常，请检查配置。"),

    /* 权限错误 */
    NO_PERMISSION(5001, "没有权限"),
    PERMISSION_NOT_MODIFY_ROOT(5002, "不能修改超级管理员权限"),

    /* Socket 错误 */
    SOCKET_SERVER_PORT_ERROR(6000, "服务端口配置异常"),
    SOCKET_CLIENT_IP_ERROR(6001, "客户端IP配置异常"),
    SOCKET_CLIENT_PORT_ERROR(6002, "客户端端口配置异常"),
    SOCKET_CLIENT_DATA_ERROR(6003, "客户端发送数据为空"),

    // 授权信息异常
    OAUTH_CLIENT_NOT_EXIST(7000, "授权信息不存在"),
    // 降级
    FEIGN_DEGRADATION(8000, "远程调用-系统功能降级"),
    SENTINEL_DEGRADATION(8001, "流量治理-系统功能降级"),
    SENTINEL_FLOW_LIMITING(8002, "流量治理-系统限流"),
    SENTINEL_HOT_PARAM_FLOW(8003, "流量治理-热点参数异常"),
    SENTINEL_SYSTEM_BLOCK(8004, "流量治理-系统异常"),
    SENTINEL_AUTHORITY(8005, "流量治理-授权异常"),
    SENTINEL_ERROR(8006, "流量治理-未知异常"),
    SENTINEL_FLOW_LIMITING_MESSAGE(8007, "服务繁忙, 请稍后再试!"),

    SYSTEM_RESOURCE_ERROR(8100, "系统资源异常"),

    SERVLET_ERROR(9000, "服务器异常"),
    SERVLET_ERROR_NOT_FOUND_REQUEST(9001, "未发现指定接口"),

    MQ_MODULE_INFO_EMPTY(10000, "消息队列信息为空"),
    MQ_ROUTING_KEY_EMPTY(10001, "RoutingKey 未配置"),
    MQ_EXCHANGE_EMPTY(10002, "Exchange 未配置"),
    MQ_EXCHANGE_NAME_EMPTY(10003, "Exchange 的 name 属性未配置"),
    MQ_QUEUE_EMPTY(10004, "Queue 未配置"),
    MQ_QUEUE_NAME_EMPTY(10005, "Queue 的name属性未配置"),
    MQ_EXCHANGE_TYPE_UNKNOWN(10006, "未知交换机类型"),
    MQ_CALLBACK_EMPTY(10007, "消息回调为空"),
    MQ_DATA_EMPTY(10008, "消息内容为空"),
    MQ_MESSAGE_OVER_MAX_LENGTH(10009, "消息内容超过允许最大长度"),
    MQ_MESSAGE_EMPTY(10010, "消息不存在"),

    MSG_SMS_TYPE_ERROR(11000, "短信类型异常"),
    MSG_SMS_TEMPLATE_EMPTY(11001, "短信模板不能为空"),

    MSG_MAIL_RECEIVER_EMPTY(12001, "邮件接收者不能为空"),
    MSG_MAIL_SEND_EMPTY(12002, "邮件发送信息为空"),
    MSG_MAIL_SEND_SUCCESS(12003, "邮件已发送成功"),

    MINIO_CHECK_BUCKET_ERROR(13000, "校验存储桶是否存在异常"),
    MINIO_CREATE_BUCKET_FAILED(13001, "创建存储桶失败"),
    MINIO_PUT_OBJECT_EMPTY(13002, "上传对象不能为空"),
    MINIO_PUT_OBJECT_ERROR(13003, "上传对象异常"),
    MINIO_GET_OBJECT_ERROR(13004, "下载对象异常"),
    MINIO_LIST_BUCKET_ERROR(13005, "获取存储桶列表异常"),
    MINIO_GET_BUCKET_ERROR(13006, "获取存储桶异常"),
    MINIO_DELETE_BUCKET_ERROR(13007, "删除存储桶异常"),
    MINIO_REMOVE_OBJECT_ERROR(13008, "删除对象异常"),
    MINIO_POLICY_ERROR(13009, "获取临时授权失败"),

    FILE_DOWNLOAD_ERROR(14000, "文件下载失败"),

    DB_PRIMARY_KEY_CONFLICT(15000, "主键冲突")

//    USER_ERROR("A0001", "用户端错误"),
//    USER_LOGIN_ERROR("A0200", "用户登录异常"),
//
//    USER_NOT_EXIST("A0201", "用户不存在"),
//    USER_ACCOUNT_LOCKED("A0202", "用户账户被冻结"),
//    USER_ACCOUNT_INVALID("A0203", "用户账户已作废"),
//
//    USERNAME_OR_PASSWORD_ERROR("A0210", "用户名或密码错误"),
//    PASSWORD_ENTER_EXCEED_LIMIT("A0211", "用户输入密码次数超限"),
//    CLIENT_AUTHENTICATION_FAILED("A0212", "客户端认证失败"),
//    TOKEN_INVALID_OR_EXPIRED("A0230", "token无效或已过期"),
//    TOKEN_ACCESS_FORBIDDEN("A0231", "token已被禁止访问"),
//
//    AUTHORIZED_ERROR("A0300", "访问权限异常"),
//    ACCESS_UNAUTHORIZED("A0301", "访问未授权"),
//    FORBIDDEN_OPERATION("A0302", "演示环境禁止修改、删除重要数据，请本地部署后测试"),
//
//
//    PARAM_ERROR("A0400", "用户请求参数错误"),
//    RESOURCE_NOT_FOUND("A0401", "请求资源不存在"),
//    PARAM_IS_NULL("A0410", "请求必填参数为空"),
//
//    USER_UPLOAD_FILE_ERROR("A0700", "用户上传文件异常"),
//    USER_UPLOAD_FILE_TYPE_NOT_MATCH("A0701", "用户上传文件类型不匹配"),
//    USER_UPLOAD_FILE_SIZE_EXCEEDS("A0702", "用户上传文件太大"),
//    USER_UPLOAD_IMAGE_SIZE_EXCEEDS("A0703", "用户上传图片太大"),
//
//    SYSTEM_EXECUTION_ERROR("B0001", "系统执行出错"),
//    SYSTEM_EXECUTION_TIMEOUT("B0100", "系统执行超时"),
//    SYSTEM_ORDER_PROCESSING_TIMEOUT("B0100", "系统订单处理超时"),
//
//    SYSTEM_DISASTER_RECOVERY_TRIGGER("B0200", "系统容灾功能被出发"),
//    FLOW_LIMITING("B0210", "系统限流"),
//    DEGRADATION("B0220", "系统功能降级"),
//
//    SYSTEM_RESOURCE_ERROR("B0300", "系统资源异常"),
//    SYSTEM_RESOURCE_EXHAUSTION("B0310", "系统资源耗尽"),
//    SYSTEM_RESOURCE_ACCESS_ERROR("B0320", "系统资源访问异常"),
//    SYSTEM_READ_DISK_FILE_ERROR("B0321", "系统读取磁盘文件失败"),
//
//    CALL_THIRD_PARTY_SERVICE_ERROR("C0001", "调用第三方服务出错"),
//    MIDDLEWARE_SERVICE_ERROR("C0100", "中间件服务出错"),
//    INTERFACE_NOT_EXIST("C0113", "接口不存在"),
//
//    MESSAGE_SERVICE_ERROR("C0120", "消息服务出错"),
//    MESSAGE_DELIVERY_ERROR("C0121", "消息投递出错"),
//    MESSAGE_CONSUMPTION_ERROR("C0122", "消息消费出错"),
//    MESSAGE_SUBSCRIPTION_ERROR("C0123", "消息订阅出错"),
//    MESSAGE_GROUP_NOT_FOUND("C0124", "消息分组未查到"),
//
//    DATABASE_ERROR("C0300", "数据库服务出错"),
//    DATABASE_TABLE_NOT_EXIST("C0311", "表不存在"),
//    DATABASE_COLUMN_NOT_EXIST("C0312", "列不存在"),
//    DATABASE_DUPLICATE_COLUMN_NAME("C0321", "多表关联中存在多个相同名称的列"),
//    DATABASE_DEADLOCK("C0331", "数据库死锁"),
//    DATABASE_PRIMARY_KEY_CONFLICT("C0341", "主键冲突")
    ;

    /**
     * 错误代码
     */
    private final Integer code;
    /**
     * 错误信息
     */
    private final String message;

    ResultCode(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    public Integer getCode() {
        return code;
    }

    @Override
    public String getMessage() {
        return message;
    }

    /**
     * 根据code获取message
     *
     * @param code 编码值
     * @return 异常信息
     */
    public static String getMessageByCode(Integer code) {
        for (ResultCode ele : values()) {
            if (ele.getCode().equals(code)) {
                return ele.getMessage();
            }
        }
        return null;
    }
}